package com.atguigu.gulimall.coupon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * ctrl+shift+/是生成这种块注释
 * ctrl+/是生成//这样的注释
 *
  一、如何使用nacos作为配置中心统一管理配置，需要的步骤：
 * 1、在pom文件里面引入nacos配置中心的依赖
 *            <dependency>
					<groupId>com.alibaba.cloud</groupId>
					<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
				</dependency>
 * 2、在应用的/src/main/resources/bootstrap.properties配置文件中配置Nacos Config的元数据
 *     a、当前服务的名字
			spring.application.name=gulimall-coupon
       b、指定nacos配置中心的位置，其实就是启动的这个Nacos的服务器，它兼顾了服务注册发现与配置管理
          spring.cloud.nacos.config.server-addr=127.0.0.1:8848
		c、指定从nacos配置中心里面的哪个命名空间找配置信息
		   spring.cloud.nacos.config.namespace=83060ae6-ae0f-4bd7-b2e8-73bd5a048551
		d、指定从nacos配置中心里面的哪个组Group来找配置信息(如果不配置，就默认是default分组)，就会去配置中心
          里面的一个叫数据集(Data Id)的gulimall-coupon.properties(默认规则是应用名.properties)去找配置信息
		   spring.cloud.nacos.config.group=dev
       e、在这里使用了Nacos里面加载多个配置集的功能，ext-config是扩展配置的意思，是一个list，所以写[0]、[1]这样的,
         把所有的配置信息写在application.yml太麻烦，所以分开写在ext-config里面，便于维护第三步确定了命名空间之后，
         data-id就是空间里面选择的配置文件名字，group表示属于哪一个分组，refresh表示动态刷新
				spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
				spring.cloud.nacos.config.ext-config[0].group=dev
				spring.cloud.nacos.config.ext-config[0].refresh=true
 * 3、需要给配置中心默认添加一个叫数据集(Data Id)的gulimall-coupon.properties(默认规则是应用名.properties)
 * 4、然后给 gulimall-coupon.properties(默认规则是应用名.properties) 添加你需要的任何配置信息
 * 5、如果想动态的获取配置信息，需要两个注解
		 a、  @Value("${coupon.user.name}")
		 用来获取配置文件里面的配置信息的值
		 b、  @RefreshScope
        打开了动态刷新配置文件里面的配置信息的功能,
   6、如果配置中心的数据集(Data Id)的gulimall-coupon.properties(它的分组group要选择好)与当前应用的配置文件
      application.properties都配置了相同的项，优先使用配置中心里面的值！！！不然就读取application.properties的

 二、Nacos作为配置中心的一些细节
	1、命名空间，有不同的好几种命名空间，放置不同类型的配置信息，默认是public(保留空间)：
       默认新增的所有配置信息都在public空间
        a、还可以创建不同的命名空间，放置不同的状态的配置信息，例如测试test，生产prod，dev开发等等因此，
           我们可以利用命名空间来做环境隔离！！！！！！
			注意！在bootstrap.properties配置文件要写清楚使用哪个命名空间下的配置
			spring.cloud.nacos.config.namespace=83060ae6-ae0f-4bd7-b2e8-73bd5a048551，
			要写唯一id，不能写test这种名字
		b、每一个微服务之间互相隔离配置，每一个微服务也创建自己的命名空间，这样只加载自己命名空间下的配置信息

	2、配置集:很多的配置文件(application.properties,application.yml等等），这些配置文件的集合，就叫做配置集
	3、配置集ID：类似配置文件名
       Data Id：文件名
	4、配置分组！！！！！Group，在对用的命名空间的配置管理那里有个加号，可以设置相同的Data Id分成不同的组
      默认所有的配置集都属于DEFAULT_GROUP这一组
      比如双十一用1111这一组Group配置，618的时候用618这一组Group来配置
      每个微服务创建自己的命名空间，使用配置分组区Group分环境：dev，test，prod！！！！！
			命名空间+分组，在coupon的这个命名空间，例如下面这么干
			Data Id                            Group
			gulimall-coupon.properties         dev
			gulimall-coupon.properties         prod

 三、同时加载多个配置集！！！！！！！
     可能不会将所有的配置内容都写在application.yml这个一个文件里面，一般都是拆分到不同的配置文件里面去，比如跟
     数据源有关的可能写在datasource.properties里，跟框架有关的可能写在mybatis.properties。和微服务其它有关的
     配置拆分成不同的配置文件，Nacos配置中心支持这种操作。
	 演示例子：
     在这里使用了Nacos里面加载多个配置集的功能，ext-config是扩展配置的意思，是一个list，所以写[0]、[1]这样的，
     把所有的配置信息写在application.yml太麻烦，所以分开写在ext-config里面，便于维护。第三步确定了命名空间之后，
     data-id就是空间里面选择的配置文件名字，group表示属于哪一个分组，refresh表示动态刷新
		 spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
		 spring.cloud.nacos.config.ext-config[0].group=dev
		 spring.cloud.nacos.config.ext-config[0].refresh=true

 四、总结使用
    1、微服务任何配置信息和任何配置文件，都可以放在Nacos配置中心里面
    2、只需要在bootstrap.properties说明加载nacos配置中心中哪些配置文件即可
    3、@Value，@ConfigurationPropeities等等，以前SpringBoot的任何从配置文件中获取值的方法，都能使用
    4、如果配置中心有的，优先使用配置中心的，不然就使用这里面的那个application.properties里面的
 * */

@EnableDiscoveryClient//此注解是用来开启服务注册与发现功能
@SpringBootApplication
public class GulimallCouponApplication {

	public static void main(String[] args) {
		SpringApplication.run(GulimallCouponApplication.class, args);
	}

}
